package review.Day_0504;

/**
 * @author zxc
 * @date 2023/05/04 21:42
 **/

/**
 * 题目 ：通知所有员工所需要的时间
 * 题目详述 ：
 * 公司里有 n 名员工，每个员工的 ID 都是独一无二的，编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。
 * 在 manager 数组中，每个员工都有一个直属负责人，其中 manager[i] 是第 i 名员工的直属负责人。对于总负责人，manager[headID] = -1。
 * 题目保证从属关系可以用树结构显示。
 * 公司总负责人想要向公司所有员工通告一条紧急消息。他将会首先通知他的直属下属们，然后由这些下属通知他们的下属，直到所有的员工都得知这条紧急消息。
 * 第 i 名员工需要 informTime[i] 分钟来通知它的所有直属下属（也就是说在 informTime[i] 分钟后，他的所有直属下属都可以开始传播这一消息）。
 * 返回通知所有员工这一紧急消息所需要的 分钟数 。
 *
 * 提示：
 *
 * 1 <= n <= 10^5
 * 0 <= headID < n
 * manager.length == n
 * 0 <= manager[i] < n
 * manager[headID] == -1
 * informTime.length== n
 * 0 <= informTime[i] <= 1000
 * 如果员工 i 没有下属，informTime[i] == 0 。
 * 题目 保证 所有员工都可以收到通知。
 *
 */
public class NumOfMinutes {
    // 递归遍历当前管理的所有下属;
    int max = 0;
    public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
        int time = informTime[headID];
        // 从总负责人headID开始，逐步向其下属们进行遍历;
        findMaxTime(time , headID , manager , informTime);
        return max;
    }

    private void findMaxTime(int time, int headID, int[] manager, int[] informTime) {
        // 遍历manager数组，获取所有员工的直属负责人
        for(int i = 0 ; i < manager.length ; i++){
            if(manager[i] == headID){
                // 递归遍历该员工的下属;
                findMaxTime(time + informTime[i] , i , manager , informTime);
            }
        }
        max = Math.max(max , time);
    }
}
